﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SistemaGO_Library.Persistencia.BD;

namespace SistemaGO_Library.Entidades.Pedido
{
    class RepositorioPedido : IRepositorioPedido
    {
        private BD bd = new BD();

        //Descrição: Método que é usado nas regras de negócio do sistema identificando se um pedido que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: cod = atributo identificador do pedido que vai dizer se existe ou não.
        public bool existePedido(int cod) {
            string sql = "SELECT pedido_cod FROM tb_pedido WHERE pedido_cod = " + cod + " ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["pedido_cod"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de um pedido no banco de dados.
        //Valores: ped = pedido passado para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public void inserirPedido(Pedido ped) {
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_pedido (ocorrencia_cod, pedido_data_final, pedido_observacao, pedido_situacao) ");
            sql.Append("VALUES (" + ped.Ocorrencia_cod + ", '" + ped.Pedido_data_final.ToString("MM/dd/yyyy") + "', '" + ped.Pedido_observacao+"', '"+ped.Situacao+"')");
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza busca de um pedido no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca.
        public Pedido buscarPedido(int cod) {
            Pedido ped = new Pedido();
            string sql = "SELECT * FROM tb_pedido WHERE pedido_cod = " + cod + " ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    ped.Pedido_cod = int.Parse(dr["pedido_cod"].ToString());
                    ped.Ocorrencia_cod = int.Parse(dr["ocorrencia_cod"].ToString());
                    ped.Pedido_data_final = DateTime.Parse(dr["pedido_data_final"].ToString());
                    ped.Pedido_observacao = dr["pedido_observacao"].ToString();
                }
                return ped;
            }
        }

        //Descrição: Método que realiza alteração de um pedido no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca de qual pedido ele irá alterar, novoPedido = novo pedido que será inserido no lugar do antigo.
        public void alterarPedido(int cod, Pedido novoPedido) {
            string sql;
            sql = "UPDATE tb_pedido SET ocorrencia_cod = " + novoPedido.Ocorrencia_cod + ", pedido_data_final = '" + novoPedido.Pedido_data_final.ToString("MM/dd/yyyy") + "', pedido_observacao = '" + novoPedido.Pedido_observacao + "', " + "pedido_situacao = '" + novoPedido.Situacao + "' WHERE pedido_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de um pedido no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca no banco para exclusão.
        public void excluirPedido(int cod) {
            string sql;
            sql = "DELETE FROM tb_pedido WHERE pedido_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método verifica se uma ocorrencia que tem o seu codigo informado, tem algum pedido em aberto.
        //Valores:   cod   = codigo da ocorrencia a ser avaliada.
        //Retornos:  TRUE  = quando a ocorrencia nao tiver nenhum pedido aberto
        //           FALSE = quando a ocorrencia possui pelo menos um pedido de acesso
        public bool validarPedido(int cod_ocorrencia) {

            String sql = "SELECT count(oco.ocorrencia_cod) FROM tb_ocorrencia oco INNER JOIN tb_pedido ped ON ped.ocorrencia_cod = oco.ocorrencia_cod WHERE ped.pedido_situacao = 'A' and oco.ocorrencia_cod = "+cod_ocorrencia;
            int contador = 0;
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    contador = int.Parse(dr[0].ToString());
                }
            }

            if (contador == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //Descrição: metodo que informa qual o pedido ativo para a ocorrencia informada.
        //Valores: ocorrencia_cod = codigo da ocorrencia.
        //Retorno: retorna o codigo do pedido ativo para a ocorrencia informada.
        public int pedidoDaOcorrencia(int ocorrencia_cod) {
            int codigo_pedido = -1;
            String sql = "SELECT top 1 pedido_cod FROM tb_pedido WHERE ocorrencia_cod = " + ocorrencia_cod + " AND pedido_situacao = 'A' ORDER BY pedido_cod DESC";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True"))
            {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read())
                {
                    codigo_pedido = int.Parse(dr[0].ToString());
                }
            }
            return codigo_pedido;
        }

        public int buscarCodigoPedido()
        {
            string sql = "SELECT MAX(pedido_cod) FROM tb_pedido";
            return bd.buscarCodigo(sql) + 1;
        }

        public void mudarSituacao(string newSituacao, int cod)
        {
            string sql = "UPDATE tb_pedido SET pedido_situacao = '" + newSituacao + "' WHERE pedido_cod = " + cod + " ";
            bd.rodarComando(sql);
        }


    }
}
